Executing a parallel single cursor model

ABSTRACT

Techniques are provided for executing database statements, or portions thereof, in parallel without using slave SQL to communicate to each slave the operations to be performed by the slave. Techniques are provided for incorporating within a shared cursor the code fragments that govern both sides of the interaction between a query coordinator (QC) and remotely-located slaves. Further, techniques are provided for the QC to communicate with each slave on how and which portions of the execution plan to execute and when. A state-transition engine for slave execution under the control of the query-coordinator is also provided.

PRIORITY CLAIM/RELATED CASES

This application claims the benefit of priority from U.S. Provisional Application Ser. No. 60/530,413, entitled “PARALLEL SHARED CURSORS” filed Dec. 16, 2003, which is incorporated by reference in its entirety for all purposes as if fully set forth herein.

This application claims priority to and is a continuation in part of U.S. patent application Ser. No. 10/824,887, entitled “COMPILATION AND PROCESSING A PARALLEL SINGLE CURSOR MODEL” filed Apr. 13, 2004, the contents of which are incorporated by reference in their entirety for all purposes as if fully set forth herein.

This application is related to U.S. patent application Ser. No. 10/898,300, entitled “DYNAMIC PERFORMANCE VIEWS WITH A PARALLEL SINGLE CURSOR MODEL” filed Jul. 23, 2004, the contents of which are incorporated by reference in their entirety for all purposes as if fully set forth herein.

This application is related to U.S. patent application Ser. No. 10/841,991, entitled “EXECUTING FILTER SUBQUERIES USING A PARALLEL SINGLE CURSOR MODEL” filed May 6, 2004, the contents of which are incorporated by reference in their entirety for all purposes as if fully set forth herein.

This application is related to U.S. patent application Ser. No. 10/901,411, entitled “PARALLEL SINGLE CURSOR MODEL ON MULTI-SERVER CONFIGURATIONS” filed Jul. 27, 2004, the contents of which are incorporated by reference in their entirety for all purposes as if fully set forth herein.

FIELD OF THE INVENTION

The present invention relates to managing data and, more specifically, to parallelizing operations that involve managing data.

BACKGROUND

Database applications interact with a database server by submitting to the database server commands that cause the database server to perform operations on data stored in a database. A database command that is sent from a database application to a database server contains the “original statement” of the database command.

For the database server to process the commands, the commands must conform to a database language supported by the database server. One database language supported by many database servers is known as the Structured Query Language (SQL).

When a database server receives the original statement of a database command from a database application, the database server must first determine which actions should be performed in response to the database command, and then perform those actions. The act of preparing for performance of those actions is generally referred to as “compiling” the database command, while performing those actions is generally referred to as “executing” the database command.

Various database languages, such as SQL, support special-purpose constructs referred to herein as “cursors”. During the compilation of a query statement, the database server may perform a significant amount of preliminary work for the statement, such as parsing, semantic analysis, and query plan generation. A cursor stores the results of much of this preliminary work. For example, one set of information stored in a cursor includes the execution plan for performing the operations specified by the SQL statement.

One method of representing an execution plan is a row-source tree. At execution, traversal of a row-source tree from the bottom up yields a sequence of steps for performing the operation(s) specified by the SQL statement. A row-source tree is composed of row-sources. During the compilation process, row-sources are allocated, and each row-source is linked to zero, one, two, or more underlying row-sources. The makeup of a row-source tree depends on the query and the decisions made by a query optimizer during the compilation process. Typically, a row-source tree is comprised of multiple levels. The lowest level, the leaf nodes, access rows from a database or other data store. The top row-source, the root of the tree, produces, by composition, the rows of the query that the tree implements. The intermediate levels perform various transformations on rows produced by underlying row-sources.

The row-source tree representation of execution plans is described in detail in U.S. Pat. No. 5,857,180, entitled “Method and apparatus for implementing parallel operations in a database management system”, issued to Hallmark et al on Jan. 5, 1999, the entire contents of which are incorporated herein. Hallmark also describes a “row-source approach” for parallelizing the operations required by an SQL command by parallelizing portions of the execution plan of the query. The row-source approach to parallelizing queries is described in greater detail below.

Parallel Execution of a Query Using Slave SQL

Sequential query execution uses one processor and one storage device at a time. In contrast, parallel query execution uses multiple processes to execute, in parallel, suboperations of a query. For example, virtually every query execution includes some form of manipulation of rows in a relation, or table of the database management system (DBMS). Before any manipulation can be done, the rows must be read, or scanned. In a sequential scan, the table is scanned using one process. Parallel query systems provide the ability to break up the scan such that more than one process can get involved in performance of the table scan.

Various techniques have been developed for parallelizing queries. Such techniques typically rely on an underlying query processing model. For example, one model (a “row-source model”) for parallelizing queries is described, in U.S. Pat. No. 5,857,180, which was mentioned above. According to the row-source (iterator) model of SQL execution, data flows through the SQL operations modeled by a row-source in the form of row-vectors. Specifically, a parallel plan is built on the Query Coordinator (QC). The parallel plan is subdivided into sub-plans or sub-trees, each called a DFO (Data Flow Object), each of which are scheduled and run in parallel on a set of parallel execution slaves.

One of the main design issues in any parallel SQL execution engine is how to express and communicate these tasks or sub-plans to the parallel slave processes. According to one implementation of the row-source model, a specialized form of SQL, called slave SQL, is used to express such tasks or sub-plans. Slave SQL is standard SQL plus some extensions to support notions like data partitioning and flow of partitioned data from one DFO to another.

According to the same approach, the slave SQL, corresponding to each DFO, is sent to slaves. Upon receiving a slave SQL command, a slave compiles the slave SQL and executes the slave SQL using control information sent from the QC. The global parallel plan has a SQL cursor corresponding to each Data Flow Object (DFO). So, running a parallel query involves parsing, unparsing and executing a parallel cursor on the QC side and parsing and executing on a slave set one cursor per DFO.

When compiled by slaves, the DFO cursors expressed in slave SQL often generate special row-sources that a QC plan would never show. Given the complexity of this picture, parallel queries can be hard to manage, monitor and tune. Also, generating slave SQL for each DFO from the physical execution plan (comprising of row-source plus some parallel annotation) is difficult and error-prone, since the compilation structures get manipulated and transformed extensively after the high level SQL gets parsed, semantic-checked, optimized and compiled into the physical row-source plan.

As explained above, slave SQL is a means to generate the correct execution plan on the slave. To do this, the database server has to add, parse and maintain special slave SQL constructs such as group-by staging operators, bitmap index specific operators, etc. Supporting slave SQL requires specialized slave-specific support from parsing all the way through execution. The amount of slave-specific support required to support the slave SQL approach results in a preponderance of slave specific code and has historically caused a large number of bugs. In addition, the new constructs required by slave SQL have to be SQL expressible.

As mentioned above, one step in the generation of the slave SQL statements that are sent to the slave sets is the unparsing of the row-source tree created for the original statement, and the data-flow operators contained therein. Such unparsing operations are difficult and error-prone. Typically, the database server has to generate a (supposedly implementation free) high level representation of the operations represented by each of the data flow operators. Within a relational database system that supports the SQL language, it is natural that the SQL language is used to express such high level representations of dataflow operators.

Thus, while the original statement is parsed to derive the query plan, portions of the query plan must be “un-parsed” to produce slave SQL statements. Unfortunately, by the time the database server reaches the post-compilation phase, when unparsing for slave SQL is performed, the compilation process has modified or moved around information (e.g. predicates) that needs to be gathered together again to correctly regenerate a query. This unparsing process is very specific to the parallel execution engine and requires statement-specific support, which can be cumbersome and error-prone.

In addition, using the slave SQL approach, parallelization of new SQL operations is usually done well after the design and implementation of the serial operation. Some of the decisions taken in the compilation layers for the serial implementation (which is based on the original statement) can contradict the requirements of generation and support for slave SQL.

The approaches described in this section are approaches that could be pursued, but not necessarily approaches that have been previously conceived or pursued. Therefore, unless otherwise indicated, it should not be assumed that any of the approaches described in this section qualify as prior art merely by virtue of their inclusion in this section.

BRIEF DESCRIPTION OF THE DRAWINGS

The present invention is illustrated by way of example, and not by way of limitation, in the figures of the accompanying drawings and in which like reference numerals refer to similar elements and in which:

FIG. 1 is a block diagram illustrating a system in which slave processes perform work based on shared cursors and equivalent cursors, according to an embodiment of the invention;

FIG. 2 is a block diagram illustrating slave processes that have access to an entire execution plan of a query, according to an embodiment of the invention;

FIG. 3 is a block diagram illustrating a system in which a query coordinator interacts with slave processes to ensure matching signatures and to execute certain portions of the execution plan, according to an embodiment of the invention; and

FIG. 4 is a block diagram illustrating a computer system upon which embodiments of the invention may be implemented.

DETAILED DESCRIPTION

In the following description, for the purposes of explanation, numerous specific details are set forth in order to provide a thorough understanding of the present invention. It will be apparent, however, that the present invention may be practiced without these specific details. In other instances, well-known structures and devices are shown in block diagram form in order to avoid unnecessarily obscuring the present invention.

Functional Overview

Techniques shall be described hereafter for executing queries, or portions thereof, in parallel without using slave SQL to communicate to each slave the operations to be performed by the slave. Instead of generating one cursor for the query coordinator (QC) based on the original statement, and separate cursors for each DFO based on the slave SQL, the techniques involve sharing the cursor that is generated from the original statement among the various participants involved in the parallel execution of the operations specified in the original statement. The model used by these techniques is referred to herein as the “Parallel Shared Cursor” (PSC) model of processing, in parallel, the operations specified in SQL queries.

The Parallel Shared-Cursor (PSC) based model provides a simpler and more manageable architecture for parallel SQL cursors. Specifically, in the PSC model, the database server builds a single cursor that contains the information needed for parallel execution, and is used for the entire parallel execution process, by both the QC and the slaves on a single instance of the database server where cursor sharing is possible. Because QC unparsing and slave parse support for slave SQL is no longer required, the support of new features, monitoring of query progression, and diagnosability of query performance, become better.

Example System

FIG. 1 is a block diagram of a system in which a single cursor is shared between several processes, according to an embodiment of the invention. Specifically, a cursor 150 has been generated by a database server based on a database statement received from a database application. In the illustrated embodiment, the cursor 150 includes the original statement 152 of the database command (typically a SQL statement) for which the cursor 150 was generated. In addition, the cursor 150 includes an execution plan 154 that describes a plan for accomplishing all of the operations specified by the original statement 152 (herein referred to as the “complete execution plan”).

For the purpose of explanation, it is assumed that the database statement specifies one or more operations that can be parallelized. Consequently, the cursor 150 containing the complete execution plan is made available to a query coordinator 102 to allow the query coordinator 102 to coordinate the parallel execution of those operations.

The query coordinator 102 coordinates the parallel execution of an operation by providing to slave processes information that causes each of the slave processes to perform a portion of the parallel operation. However, the information provided to the slave processes is not in the form of slave SQL that must be separately parsed and compiled by the slave processes. Rather, as illustrated in FIG. 1, the cursor 150 that contains the execution plan 154 used by the QC is made available to the slaves. Specifically, FIG. 1 illustrates a scenario in which two slaves 104 and 106 have access to the same instance of the cursor 150 that is being used by the query coordinator, and one slave 108 that has access to a separate instance of a cursor 160 which, as shall be explained in greater detail hereafter, is an equivalent of cursor 150.

Regardless of whether a slave has access to the same cursor instance as the query coordinator, or to an instance of an equivalent cursor, the slave is privy to the same information. Significantly, that information is already in compiled form, thus avoiding the need for each slave to separately parse and compile their own cursors based on SQL fragments. Further, the information thereby available to each slave includes the complete execution plan, and is not limited to the portion of the plan that is specific to the role of that particular slave in the execution of the plan. Because the slave is exposed to this information, the slave can make intelligent decisions with respect to how to execute its portion of the plan. For example, a slave may determine how it will execute its portion of the plan based, in part, on some characteristic of the original statement. As another example, a slave may determine how it will execute its portion of the plan based, in part, on portions of the execution plan that will be executed by other slave processes.

The Complete Execution Plan

According to one embodiment, because the slaves are to perform their assigned tasks based on the shared execution plan, all the constructs used for the execution of a parallel statement are expressed as row sources in the physical plan. Consequently, there need not be any other representation of this complete execution plan, and the same representation is used by the execution engine, both in the QC and the parallel execution slaves. Constructs that may be used to supplement an execution plan to provide support for execution of the parallel statement shall be described in detail hereafter.

During the compilation of the original SQL statement, the optimizer within the database server generates a logical execution plan in multiple passes. According to one embodiment, in the first pass, the join order and access methods are picked to minimize the parallel cost of a plan (analogous to total system usage cost) given the degree of parallelism (DOP) specified for each object in the query. While computing the parallel cost of a plan in this pass, the database server takes various parallel characteristics into account, such as number of nodes, number of partitions (table or index fragment) of each object, and the default distribution method.

In the second pass, the optimizer computes the best distribution method for each operation in the parallel plan. The result is a logical representation of the execution plan that is then compiled into a tree-based representation of physical operators (row-sources). In this phase, the database server also clumps row sources into DFO's and performs some physical optimizations taking into account specific knowledge of the requirement of the operator such as clustering, ordering or data fragmentation. The process of clumping row sources is typically performed while building the row source tree for the execution plan of the statement. Clumping generally involves grouping neighboring row sources to encapsulate or define a connected component of the plan tree that will be executed on a single slave process as a single piece. The database server uses clumping to define DFOs. When two neighboring row sources in the plan tree are not clumped together, they belong to different DFOs (i.e., there is a DFO boundary between them).

FIG. 2 is a block diagram that illustrates the complete rowsource-based physical plan for a parallel hash-join with hash redistribution and a serial left-input as generated by the parallelization pass. Specifically, FIG. 2 shows the complete physical rowsource based plan corresponding to a parallel hash-join with left input serial (e.g. because it is too small to benefit from parallelism). The QC executes the Parallelizer row source and the serial left DFO (a serial scan). One set of slaves executes DFO1 (the parallel scan) and the other set of slaves executes DFO2 (the parallel hash-join). The PX-SEND and PX-RECEIVE row sources are added at DFO boundaries to implement the hash-redistribution Table Queue for rows fetched from the serial or parallel scan and sent to the parallel hash-join. As illustrated, the complete plan is provided to each of the slave processes that will participate in a part of the plan. Because each slave has access to the compiled plan, the need of an intermediate language for parallel subplans is avoided. Instead the QC and all slaves use the same parallel execution plan.

According to one embodiment, the plan is communicated by sharing the same physical copy of the plan when the slaves and QC run on the same node, and by linearizing and shipping the original SQL statement to remote nodes participating in the execution. On each remote node, the original statement is delinearized, reconstructed, and built into the cursor by one slave, and shared by all others on the same node. Alternatively, a separate copy of the complete execution plan may be sent to remote nodes by linearizing the plan into a predetermined format, for example.

Sharing the complete execution plan with the slave nodes improves the manageability and monitoring of parallel features in radical ways since all parallel constructs are expressed in the physical plan as row sources. Interesting parallel execution statistics (e.g. memory usage, number of messages, temp-space usage, network bandwidth, load skew) are all available in the row sources of the shared plan across all slaves and can be aggregated either live (for progress monitoring) or after a query finishes.

In addition, sharing the complete execution plan makes parallelization of new physical operators much easier and less error-prone, since the database server does not have to support an intermediate language on slaves, but only needs to define data distribution, clumping and DFO boundaries for the corresponding new row sources during plan compilation.

Further, sharing the complete execution plan improves code maintenance and debugging capability and reduces the memory usage associated with intermediate representations. Specifically, as discussed above, the QC and all slaves share or use the same parallel single cursor. At execution time, the QC only has to send control information to slaves to schedule the various DFOs (illustrated by the arrows in FIG. 2). Slaves scanning an object request and receive object fragment (granule) information via the granule iterator row source controlled by the QC (executing the parallelizer row source). Dynamic load balancing happens by the rate at which various slaves consume granules they receive from the QC and generate data to be sent to the consuming DFO.

Supplementing the Complete Plan

According to one embodiment, the compilation operation includes supplementing the execution plan with additional information to take into account that slave processes will be performing their specific tasks based on the plan. According to one embodiment, such additional information includes information that indicates how data produced by slaves should be redistributed, information that indicates how the operations should be ordered and scheduled, and information that indicates how base data should be horizontally partitioned.

According to one embodiment, this supplemental information is added to the complete plan by inserting certain specific row sources into appropriate locations within the plan. According to one embodiment, row sources inserted in this manner include a granule iterator row source, redistribution row sources, and slave-specific parallelizer row sources.

For the purpose of explaining the use of the new row sources, consider a database statement that selects all columns from a table foo, where the resulting rows are ordered by the values in column 1. A typical execution plan for such a statement would include a table scan row source (TSC) whose results are fed into an order-by row source (OBY). Diagrammatically, the row source tree could be represented as:

(TSC)→(OBY)

However, such a plan does not include the detail that would be required by a slave process. Specifically, in addition to the general operations that are to be performed, a slave process needs to know (1) how the table foo is to be partitioned for the purpose of parallelizing the table scan, and (2) how the slave processes that work on the table scan should re-distribute their results to slaves performing the parallel OBY.

According to one embodiment, such an execution plan is supplemented so that the table scan (TSC) is followed by a granule iterator (GRA) that indicates how the table scan operation is to be horizontally divided among the scan slaves. Because the results of the table scan are sent from one set of slaves (the TSC slaves) to another set of slaves (the OBY slaves), a “sender-side distribution” row source (PXSEND) is placed after the granule iterator, and a “receiver-side distribution” row source (PXRECV) is placed before the order by row source. Finally, a parallelizer row source (PX) is added to the top of the row source tree to denote that it controls the parallel execution and scheduling of the parallel (sub)tree below it. Thus, the resulting plan will be:

(TSC)→(GRA)→(PXSEND)→(PXRECV)→(OBY)→(PX)

The Granule Iterator Row Source

In the present example, (GRA) encapsulates the horizontal portioning of a base object, such as an index, table, index-organized-table (IOT), or external table, for the purpose of distributing the data from the base object among multiple slaves. In the present example, (GRA) would represent the division of table foo for performing the parallel scan operation. According to one embodiment, the (GRA) row source includes logic for requesting a granule of work from the QC. Such requests may be sent to the QC by the slave process both to receive a first work granule to work on, and to receive additional work granules to work on after completing the work granule that the slave is currently working on.

Distribution Row Sources

The (PXSEND) and (PXRECV) row sources represent the distribution of data between sets of slave processes, or between the QC and a set of slave processes. Specifically, the (PXSEND) row source represents the sender-side boundary where redistribution is taking place, and includes information about how the senders should distribute the data they produce. In the present example, the (PXSEND) row source would indicate that the (TSC) slaves are to distribute the data they produce using range partitioning based on column 1.

The (PXRECV) row source represents the receiver-side boundary where redistribution takes place, and includes information about how receivers will obtain the data upon which they are to operate. In the present example, the (PXRECV) row source includes information that indicates to the (OBY) slaves how they are to receive the data upon which they will perform their portion of the order-by operation. Specifically, the (PXRECV) row source would indicate that the (OBY) slaves are to receive data from the set of (TSC) slaves.

The Parallelizer Row Source

The parallelizer row source (PX) represents the operation of scheduling performance of the operations required by the row sources that reside below the (PX) row source in the row source tree. Thus, (PX) is a row source representation of the operations performed by the query coordinator to coordinate execution of the other row sources in the execution plan. The PX row source is added either at the top of the plan, denoting the entire query, or it is added to denote a subtree which is to be executed in parallel, but whose parent is to be executed in serial. That is, a PX row source denotes a bottom parallel to serial transition in the execution semantics modeled by a query plan.

As mentioned above, slave queries are provided access to the complete plan, and not simply a representation of the portion of the plan that they are to execute themselves. Thus, each slave query works from an execution plan that includes the (PX) row source. However, if every slave process executed the (PX) row source in the same manner as the actual QC, then the entire execution plan would be executed once for the QC, and then once again for each slave process.

To prevent such results, the parallelizer row source used by each slave indicates to the slave the specific portion of the complete plan that is to be executed by the particular slave process. Thus, within a slave process, the (PX) row source continues to control the scheduling of the operations, but is only used for scheduling the specific portion of the row source tree that has been assigned to that specific slave process.

Determining Where to Insert Granule Iterator Row Sources

As mentioned above, the granule iterator row source contains the logic for horizontally partitioning a base object. Put another way, the granule iterator row source represents the way an object should be iterated over to execute a particular operation (i.e. “for each piece of this object, do . . . ”). For parallel operations to be performed correctly, the correct partitioning logic must be included in the granule iterator row source.

According to one embodiment, all of the physical iterators (chunks, block range and partition) are consolidated into the unified “granule iterator”. The granule iterator behaves differently depending on whether the execution context is QC or a slave process. In the QC execution context, the granule iterator includes logic for the QC to provide work granules to requesting slave processes, where the work granules are based on a horizontal partitioning of a base object. In the slave process execution context, the granule iterator causes a slave process to request work granules from the QC.

Granule iterators may be placed, for example, at the same location that partition iterators would otherwise appear. When a granule iterator replaces a partition iterator, some transformation may be required on the row source associated with the replaced partition iterator row source. For example, assume that a partition iterator row source is associated with a table scan row source, upon changing the partition iterator row source to a granule iterator row source, the corresponding scan operations may be translated from a full table scan into a rowid range scan. Under similar circumstances, an index fast full scan is translated into an index rowid range scan, etc.

Under some circumstances, it may be necessary to insert a granule iterator row source at a location where no partition iterator exists. For example, if a single partition is accessed and known at runtime, then the row source tree may contain no partition iterator. This situation is detected by testing whether the logic of the corresponding scan row source is limited to a single partition.

As another example, a row source tree may contain a nested partition iterator (e.g. one for the range dimension and one for the hash sub-dimension of a range-hash composite partitioned table). When accessing a composite table, the serial plan would contain two partition iterators, one for each dimension. In parallel, the two partition iterators are replaced by a single granule iterator. A granule iterator uses the absolute dimension, as of each of the serial partition iterators uses the logical dimension. According to one embodiment, the compilation process includes logic for detecting the nesting of partition iterators, and transforms them into the appropriate single granule iterator. When executed in serial, a granule iterator then iterates on the absolute dimension.

Determining Where to Insert Distribution Row Sources

During the compilation of a database statement, the row source tree of the execution plan is generated, typically in a bottom up fashion. A parallelized version of the execution plan involves identifying row sources that represent operations that can be parallelized, and generating DFOs for those operations. Once a parallelized version of an execution plan has been generated, the plan may be inspected to identify boundaries of DFOs. Distribution row sources are then inserted into the row source tree at the identified boundaries. Specifically, a (PXSEND) row source is inserted at the boundary between a DFO and the row source that consumes the output of the DFO. Similarly, a (PXRECV) row source is inserted at the boundary between a DFO and the row source the produces the data consumed by the DFO.

Buffering Data Between DFOS

When an execution plan contains an operation that is to be executed in parallel, the data consumed by the operation must be provided to the slave set assigned to the operation, and the slave set must provide their output to the one or more processes that will consume the output of the operation. Depending on the nature of the operations involved, the slave set may have to wait for the input data set to be completely generated prior to consuming any of the incoming data. Similarly, it may be necessary for the slave set to finish the entire operation before any of their output can be consumed. In any parallel execution model with a limited number of slave sets to assign to parallel operations in a query plan, buffering has to be implemented to allow a slave set to finish one operation (DFO) and start another.

According to one embodiment, during compilation of complete plan, constructs representing buffers are inserted between producer DFOs and consumer DFOs, for storing the data produced by the producers until conditions are such that the consumers may commence consuming the data. Based upon these constructs, slave processes involved in a parallel operation are informed as to the location of the data they are to consume, and/or the location at which to store the data that they produce. Note that with a larger number of slave sets, and with pipelined operations within the DFOs, more than two DFOs can be active or executed concurrently. That, is more than one producer slave set and more than one consumer slave set can be active simultaneously. The allocation of buffers at the top of DFOs alluded to here can be generalized to the scheduling of a DFO tree on any arbitrary number of slave sets.

External Expressions

In certain situations, slaves that are executing a portion of a DFO require information that is not included in the data that is consumed by the slaves. Such situations are created by the presence of external expressions. For example, consider the database statement:

SELECT*FROM T1, T2

WHERE T1.col1=T2.col2

The execution plan for this statement may call for a serial scan of table T1, and a parallel probe of an index that is built on T2.col2. In this example, the slaves assigned to probe of the index require the current value of T1.col1 in order to perform their probes. According to one embodiment, such external expressions are identified during compilation of the execution plan, and an indication of the external information required by a row source is stored in association with the row source.

During execution, when the QC is coordinating the execution of the DFO of a row source that requires external information, the QC uses the information in the row source to determine what external information is required, and ensures that the required information is provided to the slave processes that are executing the DFO. In the example given above, the index probe row source would include information that would inform the QC of the need to provide the slave processes that are performing the index probe with the current value of T1.col1.

Communicating the Complete Plan

When slaves are executing in the same database server as the QC, then the same instance of the complete plan may be accessed by both the QC and the local slaves. However, sharing the same instance of the complete plan is typically not feasible with slaves that reside in nodes (e.g. SMP machines) that are remote relative to the QC. According to one embodiment, the complete plan is communicated in some predetermined (e.g. linearized) format by sending the original statement to those remote nodes, and causing the original plan for the same statement to be re or de-constructed (e.g. delinearized) from the message, so as to create a separate instance of the same complete plan. Within a remote node, any number of slaves may share access to the instance of the complete plan that has been constructed, based on the original statement, for the node.

Verifying Correctness of Remote Instances of the Plan

Unfortunately, it is possible for a remote node to compile the original statement in a manner that produces a second instance of the execution plan that is sufficiently different from the first instance of the execution plan that use of the second instance would lead to errors. Therefore, according to one embodiment, the correctness of such remote instances is determined by (1) generating one or more signatures based on the contents of the instance of the complete plan that is used by the QC (the “local” instance), (2) generating one or more signatures based on the contents of each remote instance of the complete plan, and (3) comparing the signatures of the local instance against the signatures of each of the remote instances. If the signatures of the local instance do not match the signatures of any remote instance, then the remote instance is considered incorrect. Consequently, the slaves that would otherwise have used the incorrect remote instance of the execution plan do not participate in the execution of the query.

It is possible for some portions (e.g. serial subtrees in the plan) of a remote execution plan to differ from the corresponding portions of the local execution plan without affecting the correctness of the result. Therefore, according to one embodiment, the signatures are generated only on those portions of the execution plan that must match in order to ensure correctness of the operation.

Increasing the Chance of Matching Signatures

Certain information, such as the original statement and the values of any bind variables, are sent to slaves to ensure correct parsing and execution of the statement. However, this information does not guarantee that a remotely generated execution plan will be usable. It is inefficient to have remote execution plans generated merely to later determine that they and their corresponding slaves cannot be used. Therefore, according to one embodiment, additional information is sent to remote nodes, along with the original statement and the values of any bind variables, in order to increase the chances that the remotely generated instance of the execution plan will be sufficiently similar to the local plan. According to one embodiment, such additional information includes the parameter values used by the optimizer that generated the local plan, and the parameter values used in the session in which the original statement was received. By taking this information into account, the optimizer on the remote nodes are more likely to generate remote execution plans that can be used by remote slaves to correctly perform portions of the parallel operation.

Directing the Execution of Slave Processes

As explained above, each slave process has access to the complete execution plan, either through access to the originally generated execution plan, or through access to an equivalent execution plan. Because much of the execution plan is going to be performed by multiple processes rather than a single slave process, each slave process must be told which portion of the complete plan represents the task for that particular slave process to perform. Specifically, the execution of the complete execution plan must be intercepted in each slave, and the slave must be redirected to execute the appropriate DFO under the appropriate parallelizer. Consequently, scheduling is performed from inside the global cursor which includes the complete parallel execution plan instead of being performed from outside the multiple slave SQL cursors with one cursor representing each schedulable DFO.

According to one embodiment, at the end of compilation of the global cursor, all the row sources necessary to the parallel execution (e.g. parallelizer, redistribution row sources like PXSend and PXRecv, granule iterator and buffers) are placed into the row source tree. In addition, to the extent that equivalent cursors were generated at remote nodes, the equivalent cursors were generated based on additional information, such as statistics and parameters, and the plan signature was used to check for equivalence. Further, parallel information (e.g. DFOs are linked in execution order for each slave set) has been prepared, and buffers have been allocated.

Query Monitoring

There are usually many possible ways for a database server to perform the operations required by a query. For a variety of reasons, it is important for a database administrator to be able to monitor queries to how the database is performing the queries. The ability to monitor the execution of a query is generally referred to as “Query Monitoring”.

Query Monitoring has traditionally been a weak area for parallel queries. One of the key elements in making a complex feature like parallel queries more manageable and tunable is the ability to see and relate all the parallel activities. With the slave SQL parallel query (PQ) execution model, there is one QC cursor and n slave cursors being run. The only cursor known to the user is specifically the one that is not executed, the serial cursor. This is very confusing for an end-user. These multiple cursors make query monitoring a difficult prospect. For instance, a parallel partition maintenance operation is translated at the slave SQL level as a parallel Create Table As Select statement with possibly multiple input queries. To relate all these parallel cursors, the database administrator needs a profound understanding of the internal behavior of PQ. In contrast, the single-cursor based design substantially improves manageability of a parallel query and makes it similar to the serial execution model.

Statistics Gathering

Every time a query is executed, only one of the several possible ways to execute the query is used. It is possible that the selected way of performing the operations is not the optimal way. One way to test the performance level of the selected execution plan is to include in the database server a mechanism for monitoring and recording the performance statistics of query execution. This information may then be used to “tune” the database server for better future performance of the query.

Tuning and diagnostic support has traditionally been difficult when one or more operations required by the query are performed in parallel by slave processes. One of the key elements in making a query parallelization more manageable and tunable is the ability to provide aggregated statistics across a run of a query and across all the slaves. This fits in very closely to the overall goal of manageability.

The cursor is the basic repository for all the current and new statistics. When slave SQL is used as the mechanism to communicate to the slaves the specific tasks they are to perform, there is one QC cursor and n slave cursors being run. These multiple cursors make aggregated statistics computation a difficult prospect since they don't have the same shape.

In contrast, the parallel-shared cursor approach substantially improves manageability of a parallel query and makes it similar to the serial execution model. This way all the effort put into the serial statistics gathering can be reused. The database server is able to have a central repository for all parallel execution statistics on a cursor basis. Since the QC cursor has a one-to-one correspondence at the row-source level with the cursor executed in the slaves, row-sources can be used to contain aggregated values gathered for all the slaves. Thus, according to one embodiment, the database server provides an infrastructure to store, access and aggregate statistics across all the shared slave cursors.

Interaction Between the QC and Slaves During Execution

As explained above, using the PSC approach, a single cursor is executed by both the QC and the slaves. Consequently, the database server has to ensure that signatures match before the QC gives slaves on remote nodes instructions on what to execute. In addition, the QC needs to indicate to the slaves the part of the execution plan that they are suppose to execute. FIG. 3 illustrates the interaction between the QC and a slave to illustrate how, according to one embodiment, the QC and slave processes interact to ensure that the slave processes perform the correct portion of the execution plan at the appropriate time.

Referring to FIG. 3, in step 302 a PARSE command is sent to slaves that are requested to participate in the parallel execution of the query. Included with the PARSE command are: the original SQL statement, all contexts, such as any bind variables, used by the optimizer/compiler on the local node, and a set of signatures based on the QC cursor.

In response to the PARSE command, the slave determines whether the slave can use an existing cursor for the query. For example, slaves on the local node may be able to use the QC cursor, are therefore do not have to compile their own separate copy. The original SQL statement and context are then compiled by those slaves that cannot use an existing cursor for the query. Each slave that generated a separate cursor then determines whether the signatures of its compiled execution plan match the signatures sent from the QC.

At step 304, each slave sends a message to the QC indicating whether the slave can participate in the parallel query (i.e. whether signatures match). If the signatures do not match on a particular remote node, then the slaves running on that node refuse to join the execution. The slaves that join execution are referred to herein as “participating slaves”. The participating slaves typically include (1) all remote slaves whose signatures match and (2) all local slaves.

In the execution plan illustrated in FIG. 3, the outputs of DFO0 and DFO1 are consumed by DFO2. Therefore, the slaves assigned to DFO0 and DFO1 produce rows, and the slaves assigned to DFO2 consume rows. Participating slaves assigned to DFOs that produce rows are referred to herein as “producing slaves”, while slaves assigned to DFOs that consume rows are referred to herein as “consuming slaves”.

In step 306, the QC sends the producing slaves an EXECUTE message (step 306) that indicates which portion (i.e. DFO) of the execution plan to execute. If the operation on a DFO is such that the DFO is broken up into granules, then the EXECUTE message also identifies the first granule for the slave process to execute. An example of an operator that requires granule indication is “base object scan”, whereas “join” is an operator that does not require granule indication.

In response to the EXECUTE message, the producing slaves prepare to execute their respective DFOs. When a producing slave is ready to produce rows, the producing slave sends a READY message to the QC (step 308), which indicates that the slave has started to execute its DFO. When the QC receives a READY message from all producing slaves, the QC then sends an EXECUTE statement (step 310) to all consuming slaves.

Each consuming slave then sends a STARTED message to the QC (step 312) indicating that the consuming slave is ready to process the rows produced by the producing slaves. When the QC has received a STARTED message from all consuming slaves, the QC sends a RESUME message (step 314) to the producing slaves to resume executing.

It is important to note that under the slave SQL PQ execution model, the QC delegates only parallel portions of the execution plan to the slave processes, and thus the QC is responsible for all serial portions of the execution plan. Under the PSC execution model, however, because the cursor is shared among all the slaves, the QC can delegate all portions of the execution plan, whether serial or parallel, to slave processes.

According to one embodiment, when a slave has finished executing a DFO or granule, the slave sends a different READY message, indicating to the QC that the slave has finished executing and that the slave is ready to receive more work from the QC, such as another granule or DFO to work on. The QC then sends another DFO or granule to the slave. By dividing up operations into granules, faster slaves will work on more granules, and slower slaves will work on fewer granules, thus ensuring that large granules or entire DFO operations are not significantly slowing down the entire execution of the plan.

Primary and Shadow Query Coordinators

Under the slave SQL execution model, there is one QC cursor and n slave cursors. The n slave cursors do not include the entire execution plan, but rather only include the portions of the execution plan that the corresponding slaves are working on. Under the PSC execution model, however, all slaves see the entire execution plan, because they have access to the same cursor that the QC uses. Because they have access to the entire execution plan, the slaves can take into account information, from portions of the plan that they are not to perform, in determining how to execute the portion of the plan that they are to perform.

According to one embodiment, the QC executes logic in the parallelizer row source of the physical plan generated for the QC query (i.e. cursor) to coordinate the execution of the parallel query at a global level. This can be termed the “primary query coordinator”. At an iterator or row source level, this is encapsulated in the PX rowsource. Consider a slave process participating in the execution of this parallel query. It has access to exactly the same plan i.e. rowsource tree as the QC process. The coordination on the slave side is done by what is referred to herein as the “shadow” query coordinator, which is encapsulated in logic inside the PX rowsource of the cursor copy that the slave is executing. In understanding the coordination required between QC and slaves for a parallel query, the scenario is conceptually symmetric and simple: a primary QC is communicating with a set of shadow QCs, one for each slave cooperating in executing the query. As shall be explained in greater detail hereafter, this has a very simple implementation in the rowsource model. This symmetric concept of primary and shadow query coordinators, with the logic for each embedded inside the physical plan of the compiled parallel cursor, illustrates that the control of the parallel query happens from inside the cursor, and not from outside.

Cursor-Embedded State Machine Logic

Previously, under the slave SQL execution model, the logic for controlling execution of the slave processes (e.g. the logic that specifies the interactions illustrated in FIG. 3) was external to both the QC cursor and the slave cursors. With the PSC model, the QC and slave processes both see the entire execution plan, because the execution plan resides on the cursor shared by all processes. According to one embodiment, all of the state machine logic for both the QC and slave processes resides inside the shared parallel cursor itself.

The cursors used by the QC and the shadow QCs are equivalent (as has been made sure by matching the parallel signatures of the physical plans on the QC and slave sides) and therefore contain the same state machine logic. However, the operations performed by the QC are not identical to the operations that are performed by the shadow QCs. Therefore, to accommodate this difference, the state machine logic within the shared cursor contains branch statements, which lead the appropriate process, QC or shadow QC, to different sections in the code applicable to the QC or slave process.

More specifically, the cursor includes an execution plan. The execution plan includes a series of row sources. Each row source has a shared portion and a private portion. The shared portion a row source contains a pointer to the code fragments that are executed to perform the row source. The private portion of a row source is for holding data being produce or consumed by the process executing the row source.

One of the row sources is the parallelizer row source (PX) described above. In one embodiment, the parallelizer row source has logic for several functions, including a start function, a fetch function, and a close function. The logic for these functions is dictated by code fragments within the parallelizer row source. For functions that operate differently on the QC and the slaves, branch statements within the row source cause the QC and the slaves to execute different code fragments.

According to one embodiment, the PX fetch function contains all the execution logic for the interaction between the QC and each slave process. Within the PX fetch function, the comment code might read:

// if(“I” am a QC) // then { // send sql and signatures to remote nodes // wait for signature match messages from remote nodes // tell producing slaves to execute certain DFOs and any granules if applicable // wait for ready messages from all producing slaves . . . // } // else { “I” am a slave process // if(“I” am a remote slave process) { // wait for sql and signatures from QC // generate local instance of cursor and signatures from the sql // check to see if signatures match // if signatures do not match, send negative reply to QC and END this // slave process. Else send positive reply to QC // } // wait for execute message from QC . . . // }

Slave Execution of Serial Portions of the Plan

A plan may have both serial portions and parallel portions. Because slaves have access to the entire plan, they have access to the portions of the plan that are to be executed serially, as well as those portions that will be parallelized. Because the slaves have access to the serial portions, the QC may delegate to slaves not only parallel portions of the plan, but also serial portions. By offloading the responsibility for execution of the serial portions to remote slaves, the QC is able to more widely distribute the resource demands of executing the serial portions of the plan, to avoid overwhelming a single node.

Hardware Overview

FIG. 4 is a block diagram that illustrates a computer system 400 upon which an embodiment of the invention may be implemented. Computer system 400 includes a bus 402 or other communication mechanism for communicating information, and a processor 404 coupled with bus 402 for processing information. Computer system 400 also includes a main memory 406, such as a random access memory (RAM) or other dynamic storage device, coupled to bus 402 for storing information and instructions to be executed by processor 404. Main memory 406 also may be used for storing temporary variables or other intermediate information during execution of instructions to be executed by processor 404. Computer system 400 further includes a read only memory (ROM) 408 or other static storage device coupled to bus 402 for storing static information and instructions for processor 404. A storage device 410, such as a magnetic disk or optical disk, is provided and coupled to bus 402 for storing information and instructions.

Computer system 400 may be coupled via bus 402 to a display 412, such as a cathode ray tube (CRT), for displaying information to a computer user. An input device 414, including alphanumeric and other keys, is coupled to bus 402 for communicating information and command selections to processor 404. Another type of user input device is cursor control 416, such as a mouse, a trackball, or cursor direction keys for communicating direction information and command selections to processor 404 and for controlling cursor movement on display 412. This input device typically has two degrees of freedom in two axes, a first axis (e.g., x) and a second axis (e.g., y), that allows the device to specify positions in a plane.

The invention is related to the use of computer system 400 for implementing the techniques described herein. According to one embodiment of the invention, those techniques are performed by computer system 400 in response to processor 404 executing one or more sequences of one or more instructions contained in main memory 406. Such instructions may be read into main memory 406 from another machine-readable medium, such as storage device 410. Execution of the sequences of instructions contained in main memory 406 causes processor 404 to perform the process steps described herein. In alternative embodiments, hard-wired circuitry may be used in place of or in combination with software instructions to implement the invention. Thus, embodiments of the invention are not limited to any specific combination of hardware circuitry and software.

The term “machine-readable medium” as used herein refers to any medium that participates in providing data that causes a machine to operation in a specific fashion. In an embodiment implemented using computer system 400, various machine-readable media are involved, for example, in providing instructions to processor 404 for execution. Such a medium may take many forms, including but not limited to, non-volatile media, volatile media, and transmission media. Non-volatile media includes, for example, optical or magnetic disks, such as storage device 410. Volatile media includes dynamic memory, such as main memory 406. Transmission media includes coaxial cables, copper wire and fiber optics, including the wires that comprise bus 402. Transmission media can also take the form of acoustic or light waves, such as those generated during radio-wave and infra-red data communications.

Common forms of machine-readable media include, for example, a floppy disk, a flexible disk, hard disk, magnetic tape, or any other magnetic medium, a CD-ROM, any other optical medium, punchcards, papertape, any other physical medium with patterns of holes, a RAM, a PROM, and EPROM, a FLASH-EPROM, any other memory chip or cartridge, a carrier wave as described hereinafter, or any other medium from which a computer can read.

Various forms of machine-readable media may be involved in carrying one or more sequences of one or more instructions to processor 404 for execution. For example, the instructions may initially be carried on a magnetic disk of a remote computer. The remote computer can load the instructions into its dynamic memory and send the instructions over a telephone line using a modem. A modem local to computer system 400 can receive the data on the telephone line and use an infra-red transmitter to convert the data to an infra-red signal. An infra-red detector can receive the data carried in the infra-red signal and appropriate circuitry can place the data on bus 402. Bus 402 carries the data to main memory 406, from which processor 404 retrieves and executes the instructions. The instructions received by main memory 406 may optionally be stored on storage device 410 either before or after execution by processor 404.

Computer system 400 also includes a communication interface 418 coupled to bus 402. Communication interface 418 provides a two-way data communication coupling to a network link 420 that is connected to a local network 422. For example, communication interface 418 may be an integrated services digital network (ISDN) card or a modem to provide a data communication connection to a corresponding type of telephone line. As another example, communication interface 418 may be a local area network (LAN) card to provide a data communication connection to a compatible LAN. Wireless links may also be implemented. In any such implementation, communication interface 418 sends and receives electrical, electromagnetic or optical signals that carry digital data streams representing various types of information.

Network link 420 typically provides data communication through one or more networks to other data devices. For example, network link 420 may provide a connection through local network 422 to a host computer 424 or to data equipment operated by an Internet Service Provider (ISP) 426. ISP 426 in turn provides data communication services through the world wide packet data communication network now commonly referred to as the “Internet” 428. Local network 422 and Internet 428 both use electrical, electromagnetic or optical signals that carry digital data streams. The signals through the various networks and the signals on network link 420 and through communication interface 418, which carry the digital data to and from computer system 400, are exemplary forms of carrier waves transporting the information.

Computer system 400 can send messages and receive data, including program code, through the network(s), network link 420 and communication interface 418. In the Internet example, a server 430 might transmit a requested code for an application program through Internet 428, ISP 426, local network 422 and communication interface 418.

The received code may be executed by processor 404 as it is received, and/or stored in storage device 410, or other non-volatile storage for later execution. In this manner, computer system 400 may obtain application code in the form of a carrier wave.

In the foregoing specification, embodiments of the invention have been described with reference to numerous specific details that may vary from implementation to implementation. Thus, the sole and exclusive indicator of what is the invention, and is intended by the applicants to be the invention, is the set of claims that issue from this application, in the specific form in which such claims issue, including any subsequent correction. Any definitions expressly set forth herein for terms contained in such claims shall govern the meaning of such terms as used in the claims. Hence, no limitation, element, property, feature, advantage or attribute that is not expressly recited in a claim should limit the scope of such claim in any way. The specification and drawings are, accordingly, to be regarded in an illustrative rather than a restrictive sense. 

1. A method for processing a database statement, the method comprising the steps of: receiving the database statement at a database server; determining that at least one operation required by the database statement can be parallelized; within the database server, a query coordinator generating a first execution plan that specifies how to execute all operations required by the database statement; sending the database statement to a remote slave, wherein the database statement sent to the remote slave is the same entire database statement that was received by the database server; causing the remote slave to generate a second execution plan that specifies how to execute all operations required by the database statement, wherein the database statement for which the remote slave generates the second execution plan is the same entire database statement that was received by the database server; causing the remote slave to execute logic contained within the second execution plan, wherein the logic dictates a sequence of interactions between the query coordinator and the remote slave; wherein the steps of the method are performed by one or more computing devices.
 2. The method of claim 1 wherein the logic causes the remote slave to perform the steps of: generating signatures based on the second execution plan; comparing the signatures based on the second execution plan with signatures based on the first execution plan; and sending a message to the query coordinator that indicates whether the signatures based on the second execution plan match the signatures based on the first execution plan.
 3. The method of claim 1 wherein: the remote slave is assigned to perform an operation that produces input consumed by one or more other slaves; and the logic causes the remote slave to respond to an execute message from the query coordinator by sending a ready message to the query coordinator.
 4. The method of claim 3 wherein the logic causes the remote slave to perform the steps of: after sending the ready message, responding to a resume message from the query coordinator by performing the operation that produces input.
 5. The method of claim 1 wherein: the remote slave is assigned to perform an operation that consumes input produced by one or more other slaves; and the logic causes the remote slave to respond to an execute message from the query coordinator by sending a started message to the query coordinator.
 6. The method of claim 5 wherein the query coordinator sends a resume message to the one or more other slaves in response to receiving started messages from all slaves consuming input from the one or more other slaves.
 7. A method for processing a database statement, the method comprising the steps of: receiving the database statement at a database server; determining that at least one operation required by the database statement can be parallelized; within the database server, a query coordinator generating a first execution plan that specifies how to execute all operations required by the database statement; sending the database statement to a remote slave, wherein the database statement sent to the remote slave is the same entire database statement that was received by the database server; causing the remote slave to generate a second execution plan that specifies how to execute all operations required by the database statement, wherein the database statement for which the remote slave generates the second execution plan is the same entire database statement that was received by the database server; causing the query coordinator to execute logic contained within the first execution plan, wherein the logic dictates a sequence of interactions between the query coordinator and the remote slave; wherein the steps of the method are performed by one or more computing devices.
 8. The method of claim 7 further comprising the step of: causing the remote slave to execute logic contained within the second execution plan, wherein the logic dictates a sequence of interactions between the query coordinator and the remote slave.
 9. The method of claim 8 wherein: both the first execution plan and the second execution plan include first logic to be executed by the query coordinator during the sequence of interactions; second logic to be executed by the remote slave during the sequence of interactions; and branch logic for branching to one of the first logic and the second logic based on which of the query coordinator and the remote slave is executing the branch logic.
 10. A method for processing a database statement, the method comprising the steps of: receiving the database statement at a database server; generating an execution plan for the database statement, wherein the execution plan specifies a first operation that produces data and a second operation that consumes data produced by the first operation; sending the database statement to one or more remote nodes where a first plurality of slave processes reside, wherein the database statement sent to the one or more remote nodes is the same entire database statement that was received by the database server; generating, from the database statement, at each of the one or more remote nodes, a second execution plan, wherein the database statement from which the second execution plan is generated at each of the one or more remote nodes is the same entire database statement that was received by the database server; assigning producing slaves, of the first plurality of slave processes, to perform the first operation; assigning consuming slaves, of the first plurality of slave processes, to perform the second operation; sending, to all producing slaves, a first message that indicates which portion of the second execution plan the producing slaves are to execute; receiving, from each producing slave, a second message that indicates that the producing slave is ready to execute; in response to receiving the second message from each producing slave, sending a third message to all consuming slaves that indicates which portion of the second execution plan the consuming slaves are to execute; receiving a fourth message, from each consuming slave, indicating that the consuming slave has begun to execute; and in response to receiving the fourth message from each consuming slave, sending a fifth message to each producing slave to resume execution; wherein the steps of the method are performed by one or more computing devices.
 11. The method of claim 10 wherein: sending the database statement includes sending a first set of signatures, based on the execution plan, to the one or more remote nodes; the method further comprising performing the following steps prior to sending the first message: generating a second set of signatures for each of the second execution plans; and determining whether the first set of signatures and the second set of signatures are equivalent.
 12. The method of claim 11, wherein the step of generating the second set of signatures is performed by generating the second set of signatures based only on those portions of the second execution plans that must match the first execution plan in order to ensure correctness of operations on the execution plan.
 13. A computer-readable storage medium storing one or more sequences of instructions for processing a database statement which instructions, when executed by one or more processors, cause the one or more processors to perform steps comprising: receiving the database statement at a database server; determining that at least one operation required by the database statement can be parallelized; within the database server, a query coordinator generating a first execution plan that specifies how to execute all operations required by the database statement; sending the database statement to a remote slave, wherein the database statement sent to the remote slave is the same entire database statement that was received by the database server; causing the remote slave to generate a second execution plan that specifies how to execute all operations required by the database statement, wherein the database statement for which the remote slave generates the second execution plan is the same entire database statement that was received by the database server; and causing the remote slave to execute logic contained within the second execution plan, wherein the logic dictates a sequence of interactions between the query coordinator and the remote slave.
 14. The computer-readable storage medium of claim 1, wherein the logic causes the remote slave to perform the steps of: generating signatures based on the second execution plan; comparing the signatures based on the second execution plan with signatures based on the first execution plan; and sending a message to the query coordinator that indicates whether the signatures based on the second execution plan match the signatures based on the first execution plan.
 15. The computer-readable storage medium of claim 1, wherein: the remote slave is assigned to perform an operation that produces input consumed by one or more other slaves; and the logic causes the remote slave to respond to an execute message from the query coordinator by sending a ready message to the query coordinator.
 16. The computer-readable storage medium of claim 15, wherein the logic causes the remote slave to perform the steps of: after sending the ready message, responding to a resume message from the query coordinator by performing the operation that produces input.
 17. The computer-readable storage medium of claim 1, wherein: the remote slave is assigned to perform an operation that consumes input produced by one or more other slaves; and the logic causes the remote slave to respond to an execute message from the query coordinator by sending a started message to the query coordinator.
 18. The computer-readable storage medium of claim 17, wherein the query coordinator sends a resume message to the one or more other slaves in response to receiving started messages from all slaves consuming input from the one or more other slaves.
 19. A computer-readable storage medium storing one or more sequences of instructions for processing a database statement which instructions, when executed by one or more processors, cause the one or more processors to perform steps comprising: receiving the database statement at a database server; determining that at least one operation required by the database statement can be parallelized; within the database server, a query coordinator generating a first execution plan that specifies how to execute all operations required by the database statement; sending the database statement to a remote slave, wherein the database statement sent to the remote slave is the same entire database statement that was received by the database server; causing the remote slave to generate a second execution plan that specifies how to execute all operations required by the database statement, wherein the database statement for which the remote slave generates the second execution plan is the same entire database statement that was received by the database server; and causing the query coordinator to execute logic contained within the first execution plan, wherein the logic dictates a sequence of interactions between the query coordinator and the remote slave.
 20. The computer-readable storage medium of claim 19, wherein the one or more sequences of instructions further comprise instructions which, when executed by the one or more processors, cause the one or more processors to perform the step of: causing the remote slave to execute logic contained within the second execution plan, wherein the logic dictates the sequence of interactions between the query coordinator and the remote slave.
 21. The computer-readable storage medium of claim 20, wherein: both the first execution plan and the second execution plan include: first logic to be executed by the query coordinator during the sequence of interactions; second logic to be executed by the remote slave during the sequence of interactions; and branch logic for branching to one of the first logic and the second logic based on which of the query coordinator and the remote slave is executing the branch logic.
 22. A computer-readable storage medium storing one or more sequences of instructions for processing a database statement which instructions, when executed by first one or more processors, cause the first one or more processors to perform steps comprising: receiving the database statement at a database server; generating an execution plan for the database statement, wherein the execution plan specifies a first operation that produces data and a second operation that consumes data produced by the first operation; sending the database statement to one or more remote nodes where a first plurality of slave processes reside, wherein the database statement sent to the one or more remote nodes is the same entire database statement that was received by the database server; generating, from the database statement, at each of the one or more remote nodes, a second execution plan, wherein the database statement from which the second execution plan is generated at each of the one or more remote nodes is the same entire database statement that was received by the database server; assigning producing slaves, of the first plurality of slave processes, to perform the first operation; assigning consuming slaves, of the first plurality of slave processes, to perform the second operation; sending, to all producing slaves, a first message that indicates which portion of the second execution plan the producing slaves are to execute; receiving, from each producing slave, a second message that indicates that the producing slave is ready to execute; in response to receiving the second message from each producing slave, sending a third message to all consuming slaves that indicates which portion of the second execution plan the consuming slaves are to execute; receiving a fourth message, from each consuming slave, indicating that the consuming slave has begun to execute; and in response to receiving the fourth message from each consuming slave, sending a fifth message to each producing slave to resume execution.
 23. The computer-readable storage medium of claim 22, wherein: the instructions that cause sending the database statement include instructions which, when executed by the first one or more processors, cause the first one or more processors to perform the step of sending a first set of signatures, based on the execution plan, to the one or more remote nodes; and the one or more sequences of instructions further comprise instructions which, when executed by second one or more processors at each of the one or more remote nodes, cause the second one or more processors to perform the following steps prior to sending the first message: generating a second set of signatures for each of the second execution plans; and determining whether the first set of signatures and the second set of signatures are equivalent.
 24. The computer-readable storage medium of claim 23, wherein the instructions that cause the second one or more processors to perform the step of generating the second set of signatures comprise instructions which, when executed by the second one or more processors, cause the second one or more processors to perform the step of generating the second set of signatures based only on those portions of the second execution plan that must match the first execution plan in order to ensure correctness of operations on the execution plan. 